// Excel文件处理工具函数
import * as XLSX from 'xlsx'

/**
 * 将字符串转换为ArrayBuffer
 * @param {String} s - 要转换的字符串
 * @returns {ArrayBuffer} 转换后的ArrayBuffer
 */
export function s2ab(s) {
    const buf = new ArrayBuffer(s.length);
    const view = new Uint8Array(buf);
    for (let i = 0; i < s.length; i++) {
        view[i] = s.charCodeAt(i) & 0xFF;
    }
    return buf;
}

/**
 * 解析Excel文件数据
 * @param {Object} fileData - Excel文件的二进制数据
 * @param {String} fileName - 文件名
 * @returns {Object} 解析后的题库数据
 */
export function parseExcelData(fileData, fileName) {
    let workbook
    
    console.log('开始解析Excel文件:', fileName)
    console.log('文件数据类型:', typeof fileData)
    
    try {
        // 将文件数据转换为ArrayBuffer
        workbook = XLSX.read(fileData, {type: 'binary'})
        console.log('Excel工作簿解析结果:', {
            SheetNames: workbook.SheetNames,
            SheetCount: workbook.SheetNames.length
        })
    } catch (error) {
        console.error('Excel解析错误:', error)
        throw new Error('Excel文件格式错误：无法解析文件内容')
    }
    
    if (!workbook.SheetNames || workbook.SheetNames.length === 0) {
        throw new Error('Excel文件格式错误：未找到工作表')
    }
    
    const firstSheet = workbook.Sheets[workbook.SheetNames[0]]
    console.log('第一个工作表信息:', {
        SheetName: workbook.SheetNames[0],
        HasSheet: !!firstSheet
    })
    
    const rawData = XLSX.utils.sheet_to_json(firstSheet, {
        header: 1,  // 使用第一行作为表头
        defval: ''  // 空单元格默认值
    })
    
    console.log('转换后的原始数据:', {
        DataLength: rawData?.length || 0,
        FirstRow: rawData?.[0],
        SecondRow: rawData?.[1]
    })
    
    // 确保数据有效且至少包含一行
    if (!rawData || rawData.length === 0) {
        throw new Error('Excel文件内容为空')
    }

    // 检查第一行是否包含足够的列数据
    const firstRow = rawData[0]
    if (!Array.isArray(firstRow) || firstRow.length === 0) {
        throw new Error('Excel文件格式错误：表头行数据无效')
    }
    
    // 获取表头行
    const headers = rawData[0]
    // 转换数据行为对象格式
    const jsonData = rawData.slice(1).map(row => {
        const obj = {}
        headers.forEach((header, index) => {
            obj[header] = row[index] || ''
        })
        return obj
    })
    
    if (!rawData || rawData.length === 0) {
        throw new Error('Excel文件内容为空')
    }
    
    // 创建新的题库对象
    const questionBank = {
        id: Date.now().toString(),
        title: fileName.replace('.xlsx', ''),
        questionCount: 0,
        createTime: new Date().toLocaleDateString(),
        questions: [],
        stats: {
            single: 0,
            multiple: 0,
            judge: 0
        }
    }
    
    // 处理题目数据
    jsonData.forEach(row => {
        const questionType = row['题型']
        const typeMap = {
            '单选': 'single',
            '多选': 'multiple',
            '判断': 'judge'
        }
        
        const type = typeMap[questionType]
        if (!type) return
        
        // 解析选项
        let options = []
        for (let key of ['A', 'B', 'C', 'D', 'E', 'F']) {
            if (row[`答案${key}`]) {
                options.push({ key, value: row[`答案${key}`] })
            }
        }
        
        // 创建题目对象
        const question = {
            type,
            content: row['题目'],
            options,
            answer: row['正确答案'],
            analysis: row['解析'] || '',
            chapter: {
                level1: row['一级章节'] || '',
                level2: row['二级章节'] || ''
            },
            difficulty: row['难易程度'] || ''
        }
        
        // 更新统计信息
        questionBank.stats[type]++
        questionBank.questions.push(question)
    })
    
    // 更新题目总数
    questionBank.questionCount = questionBank.questions.length
    
    return questionBank
}

/**
 * 保存题库到本地存储
 * @param {Object} questionBank - 题库数据
 */
export function saveQuestionBank(questionBank) {
    let questionBanks = uni.getStorageSync('questionBanks') || []
    // 查找是否存在相同文件名的题库
    const existingIndex = questionBanks.findIndex(bank => bank.title === questionBank.title)
    
    if (existingIndex !== -1) {
        // 更新已存在的题库数据
        questionBanks[existingIndex] = questionBank
        // 显示更新成功提示
        uni.showToast({
            title: '题库更新成功',
            icon: 'success',
            duration: 2000
        })
    } else {
        // 添加新题库
        questionBanks.unshift(questionBank)
    }
    
    uni.setStorageSync('questionBanks', questionBanks)
}